from os.path import dirname, join
from PyQt5.QtCore import QUrl
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

class PlayerWidget(QWidget):
    def __init__(self, file_path, parent=None):
        super().__init__(parent)
        self.setWindowTitle("MP3播放器")
        self.resize(400, 300)
        self.button = QPushButton("播放", self)
        self.button.setGeometry(10, 10, 80, 30)
        self.button.clicked.connect(self.play)

        self.button2 = QPushButton("停止", self)
        self.button2.setGeometry(100, 10, 80, 30)
        self.button2.clicked.connect(self.stop)

        self.media_player = QMediaPlayer()
        self.media_player.setMedia(QMediaContent(QUrl.fromLocalFile(file_path)))

    def play(self):
        self.media_player.play()
    def stop(self):
        self.media_player.stop()

    def closeEvent(self, a0):
        if self.media_player.state() == QMediaPlayer.PlayingState:
            self.media_player.stop()
        super().closeEvent(a0)

file_path = join(dirname(__file__), "res", "test.mp3")
app = QApplication([])
w = PlayerWidget(file_path)
w.show()
app.exec_()

"""
QMediaPlayer 的一些常用成员函数及其解释。这些函数可以帮助你更好地管理和控制多媒体播放。

1.基本控制函数
    play()：
    开始或继续播放媒体内容。
    如果媒体正在暂停状态，则继续播放；如果媒体处于停止状态，则开始播放。
    pause()：
    暂停当前播放的媒体内容。
    stop()：
    停止当前播放的媒体内容，并重置播放位置到开头。
2.状态查询函数
    state()：
    返回当前播放器的状态，可以是 QMediaPlayer.StoppedState、QMediaPlayer.PlayingState 或 QMediaPlayer.PausedState。
    isPlaying()：
    判断当前播放器是否正在播放媒体内容。
3.音量控制函数
    volume()：
    返回当前播放器的音量值（范围通常是 0 到 100）。
    setVolume(int volume)：
    设置播放器的音量值（范围通常是 0 到 100）。
    mute()：
    设置播放器静音。
    isMuted()：
    判断播放器是否处于静音状态。
4.播放位置控制函数
    position()：
    返回当前播放位置（以毫秒为单位）。
    setPosition(int position)：
    设置播放位置（以毫秒为单位）。
    duration()：
    返回媒体内容的总时长（以毫秒为单位）。
5.错误处理函数
    error()：
    返回当前播放器的错误类型，可以是 QMediaPlayer.NoError、QMediaPlayer.ResourceError、QMediaPlayer.FormatError 等。
    errorString()：
    返回当前播放器的错误描述字符串。
6.媒体内容管理函数
    setMedia(QMediaContent content)：
    设置播放器的媒体内容。
    media()：
    返回当前播放器的媒体内容。
7.缓冲状态查询函数
    bufferStatus()：
    返回当前播放器的缓冲状态（百分比）。
8.播放速度控制函数
    playbackRate()：
    返回当前播放器的播放速度。
    setPlaybackRate(float rate)：
    设置播放器的播放速度（默认为 1.0，即正常速度）。
"""